#!/usr/bin/env python
# coding: utf-8

# # 高德API功能调用
# 
# Web服务API简介 
# 高德Web服务API向开发者提供HTTP接口，开发者可通过这些接口使用各类型的地理数据服务，返回结果支持JSON和XML格式。
# 
# Web服务API对所有用户开放。使用本组服务之前，需要申请应用Key。不同类型用户可获取不同的数据访问能力。
# 
# 高德官方文档:https://lbs.amap.com/api/webservice/summary
# 
# * 调用功能：
# * 地理/逆地理编码
# * 路径规划
# * 行政区域查询
# * 搜索POI
# * IP定位
# * 批量请求接口
# * 静态地图
# * 坐标转换
# * 天气查询
# * 输入提示
# * 交通态势

# ## 准备工作

# In[2]:


# coding-utf-8

import requests
import json
import pandas as pd
my_key = "12f80238641864b66003f76e69819ee4"  #导入需要的模块和key值


# # 地理编码和逆编码
# * 产品介绍:
# * 地理编码/逆地理编码 API 是通过 HTTP/HTTPS 协议访问远程服务的接口，提供结构化地址与经纬度之间的相互转化的能力。

# ## 地理编码
# > * 1、结构化地址的定义： 首先，地址肯定是一串字符，内含国家、省份、城市、区县、城镇、乡村、街道、门牌号码、屋邨、大厦等建筑物名称。按照由大区域名称到小区域名称组合在一起的字符。一个有效的地址应该是独一无二的。注意：针对大陆、港、澳地区的地理编码转换时可以将国家信息选择性的忽略，但省、市、城镇等级别的地址构成是不能忽略的。暂时不支持返回台湾省的详细地址信息。    
# > * 2、url:https://restapi.amap.com/v3/geocode/geo?parameters      
# > * 3、requests.get()       
# > * 4、参数：   
# 
# >> * A.必选：key（高德API秘钥），address(结构化地址)  
# >> * B.可选：
# 
# **思考场景**
# * 城市建设辅助测绘信息

#  **函数**

# In[3]:


def geo(key,address,city=None,batch=None,sig=None,output=None,callback=None)->str:
    """获取高德API的地理编码
    注释：key是指高德API的秘钥，请先去注册
          填入address地理位置获得精确经纬度
    """
    url = "https://restapi.amap.com/v3/geocode/geo?parameters"
    params = {
        "key":key,
        "address":address,
        "city":city,
        "batch":batch,
        "sig":sig,
        "output":output,
        "callback":callback
        
    }
    #pa一定要放在前面
    response = requests.get(url,params=params)
    results = response.json()['geocodes'][0]['location']
    # 返回值
    return results


# In[4]:


geo(my_key,"广东省广州市从化区中山大学南方学院")


# ## 逆地理编码
# > * 2、url:https://restapi.amap.com/v3/geocode/regeo?parameters  
# > * 3、requests.get()       
# > * 4、参数：   
# 
# >> * A.必选：key（高德API秘钥），location(经纬度坐标)  
# >> * B.可选：poitype radius
# 
# **思考场景**
# * 城市建设辅助测绘信息

# In[5]:


def regeo(key,location,poitype=None,radius=None,extensions=None,roadlevel=None,batch=None,output=None,callback=None,sig=None,homeorcorp=None)->str:
    """获取高德API的逆地理编码
    注释：key是指高德API的秘钥，请先去注册
          填入loacation经纬度获得地理位置
    """
    url = "https://restapi.amap.com/v3/geocode/regeo?parameters"
    params = {
        "key":key,
        "location":location,
        "poitype":poitype,
        "radius":radius,
        "extensions":extensions,
        "roadlevel":roadlevel,
        "batch":batch,
        "output":output,
        "callback":callback,
        "sig":sig,
        "homeorcorp":homeorcorp
        
    }
    response = requests.get(url,params=params)
    results = response.json()
    # 返回值
    return results


# In[6]:


regeo(my_key,'113.679287,23.632575')


# # 路径规划
# 
# > 路径规划API是一套以HTTP形式提供的步行、公交、驾车查询及行驶距离计算接口，返回JSON 或 XML格式的查询数据，用于实现路径规划功能的开发。 
# 
# 
# **思考场景**
# * 导航地图
# * 用户输入目的地和出发点，返回最短路径

# ## 步行路径
# > url: https://restapi.amap.com/v3/direction/walking?parameters
# * 参数：
# 
# * 必选:key,origin，destination(规则:（经度，纬度）经纬度小数点不超过6位)
# 
# * 可选:sig

# In[7]:


#获取纬度
geo(my_key,"广东省广州市从化区中山大学南方学院",None)


# In[8]:


geo(my_key,"广东省广州市从化区保利桃花源",None)


# In[9]:


def walking(key,origin,destination,output=None,callback=None,sig=None)->str:
    """获取高德API的地理编码
    注释：key是指高德API的秘钥，请先去注册
          填入origin起点经纬度
          destinaton终点经纬度
    """
    url = "https://restapi.amap.com/v3/direction/walking?parameters"
    params = {
        "key":key,
        "origin":origin,
        "destination":destination,
        "output":output,
        "sig":sig,
        "output":output,
        "callback":callback
        
    }
    response = requests.get(url,params=params)
    # 返回值
    return pd.json_normalize(response.json()['route']['paths'][0]['steps'])#列表形式获取信息


# In[10]:


walking(my_key,'113.679287,23.632575','113.678652,23.628412')


# ## 公交路径规划

# 公交路径规划 API 可以规划综合各类公共（火车、公交、地铁）交通方式的通勤方案，并且返回通勤方案的数据。
# 
# 
# URL: https://restapi.amap.com/v3/direction/transit/integrated?parameters
# 
# 请求方式:get
# 
# 文档： https://lbs.amap.com/api/webservice/guide/api/direction
# * 必选:key,origin，destination ,city
# 
# (规则:（经度，纬度）经纬度小数点不超过6位)
# 

# In[11]:


# 数据准备
origin1 = geo(my_key,"广东省暨南大学",None)
origin1


# In[12]:


destination1 = geo(my_key,"广州塔",None)
destination1


# In[13]:


def transit(key,origin,destination,city,cityd=None,extensions='base',strategy=None,nightflag=None,date=None,time=None,output=None,callback=None,sig=None)->str:
    """获取高德API地理编码
    注释： key是指高德API密钥，请去注册
    填入origin起点经纬度
    destinaton终点经纬度
    city城市/跨城规划时的起点城市
    """
    url = "https://restapi.amap.com/v3/direction/transit/integrated?parameters"
    params = {
        "key":key,
        "origin":origin,
        "destination":destination,
        "city":city,
        "cityd":cityd,
        "extensions":extensions,
        "strategy":strategy,
        "nightflag":nightflag,
        "date":date,
        "time":time,
        "sig":sig,
        "output":output,
        "callback":callback
        
    }
    Response  = requests.get(url,params=params)
    a = Response.json()
    #出发到站点
    B_walk = pd.json_normalize(a['route']['transits'][0]['segments'][0]['walking']['steps'])
    display(B_walk)
    #巴士站点
    B_bus = pd.json_normalize(a['route']['transits'][0]['segments'][0]['bus']['buslines'][0]['via_stops'])
    display(B_bus)
    #下车后到目的地
    B_walk_stop = pd.json_normalize(a['route']['transits'][0]['segments'][1]['walking']['steps'])
    display(B_walk_stop)
    


# In[14]:


transit(my_key,origin1,destination1,"广州市",'base')


# ## 驾车路径规划
# 驾车路径规划 API 可以规划以小客车、轿车通勤出行的方案，并且返回通勤方案的数据。
# 
# url : https://restapi.amap.com/v3/direction/driving?parameters
# 
# 请求参数：key,orign,destination

# In[15]:


def driving(key,origin,destination,destinationid=None,origintype=None,destinationtype=None)->str:
    """获取高德API地理编码
    注释： key是指高德API密钥，请去注册
    填入origin起点经纬度
    destinaton终点经纬度
    详情参数参考 ：https://lbs.amap.com/api/webservice/guide/api/direction
    
    """
    url = "https://restapi.amap.com/v3/direction/driving?parameters"
    params = {
        "key":key,
        "origin":origin,
        "destination":destination,
        "origintype":origintype,
        "destinationtype":destinationtype
    }
    r  = requests.get(url,params=params)
    x=r.json()
    
    return  pd.json_normalize(x['route']['paths'][0]['steps'])#列表形式打印信息


# In[16]:


aa = driving(my_key,'113.679287,23.632575','113.678652,23.628412')

aa


# # 行政区域查询
# 行政区域查询是一类简单的HTTP接口，根据用户输入的搜索条件可以帮助用户快速的查找特定的行政区域信息。
# 
# URL:https://restapi.amap.com/v3/config/district?parameters
# 
# 请求参数：key(必填)
# 选填参数：keywords subdistrict
# 
# **思考**
# 帮助用户快速查找当地行政区域

# In[17]:


def district(key,keywords:str,subdistrict=None,page=None,filter=None,offset=None,callback=None,output=None):
    """获取高德API地理编码
    注释： key是指高德API密钥，请去注册
    keywords查询关键字
    subdistrict子级行政区
    """

    url = "https://restapi.amap.com/v3/config/district?parameters"
    params = {
        "key":key,
        "keywords":keywords,
        "subdistrict":subdistrict,
        "page":page,
        "filter":filter,
        "offset":offset,
        "callback":callback,
        "output":output
        
    }
    response = requests.get(url,params=params)
    a = response.json()
    return pd.json_normalize(a['districts'][0]['districts'])


# In[18]:


a = district(my_key,"从化区")#寻找从化区的行政区
a


# # 搜索POI
# 
# 搜索服务API是一类简单的HTTP接口，提供多种查询POI信息的能力，其中包括关键字搜索、周边搜索、多边形搜索、ID查询四种筛选机制。
# URL:https://restapi.amap.com/v3/place/text?parameters
# 
# 请求参数：key(必填)
# 选填参数：keywords subdistrict
# 
# **思考**
# 
# * 根据用户搜索数据分析
# * 在广告推送时推送合适的POI
# * 精确投放

# In[19]:


def place(key,keywords:str,types=None,city=None,citylimit=None,children=None,offset=None,extensions=None,sig=None,output=None,callback=None):
    """获取高德API地理编码
    注释： key是指高德API密钥，请去注册
    types 查询POI类型
    可选值：分类代码 或 汉字（若用汉字，请严格按照附件之中的汉字填写）
    """

    url = "https://restapi.amap.com/v3/place/text?parameters"
    params = {
        "key":key,
        "keywords":keywords,
        "citylimit":citylimit,
        "children":children,
        "offset":offset,
        "extensions":extensions,
        "offset":offset,
        "sig":sig,
        "output":output,
        "callback":callback

        
    }
    
    response  = requests.get(url,params=params)
    a = response.json()
    return pd.json_normalize(a['pois'])


# In[20]:


从化POI = place(my_key,"美食" "从化" "网红")#可填写多个关键词
从化POI 


# # IP定位
# 
# IP定位是一个简单的HTTP接口，根据用户输入的IP地址，能够快速的帮用户定位IP的所在位置。
# 
# URL:https://restapi.amap.com/v3/ip?parameters
# 
# * 请求参数：key(必填)
# * 选填参数：ip sig output
# 
# **思考**
# 
# * 帮助减少骚扰电话
# * 帮助定位追踪罪犯

# In[21]:


def place(key,ip,sig=None,output=None):
    """获取高德API地理编码
    注释： key是指高德API密钥，请去注册
    ip地址 需要搜索的IP地址（仅支持国内）
    若用户不填写IP，则取客户http之中的请求来进行定位
    
    """

    url = "https://restapi.amap.com/v3/ip?parameters"
    params = {
        "key":key,
        "ip":ip,
        "sig":sig,
        "output":output,
        
    }
    
    response  = requests.get(url,params=params)
    return response.json()


# In[22]:


place(my_key,'61.242.54.130')


# # 批量请求接口
# 在此必须特别说明，使用批量接口时，key的配额和QPS会根据子请求来进行控制。
# 
# 例如：一次批量请求里面有20个驾车路径规划请求，且在同一秒发来请求，则此key的QPS消耗为20
# 
# 一、申请”web服务 API”密钥（Key）；
# 
# 二、拼接请求，第一步申请的Key需作为必填参数一同发送，父请求的Key和子请求的Key请务必保持一致；
# 
# 三、batch接口本身为post请求接口，子请求只支持get方式请求，以json形式返回数据结构；子请求参数请参考各接口文档进行拼接，如无特殊声明，接口的输入参数和输出数据编码全部统一为UTF-8；
# 
# 四、默认所有的子请求都会继承当前请求的header头；
# 
# 五、为了保证以后升级兼容，建议header里指明Content-Type：application/json；
# 
# 六、batch接口当前支持所有v3（请求中带v3字样）接口。
# 
# 
# ## 特别说明：受产品策略调整影响，自2020年11月起，建议您不再使用此批量接口。后续平台会逐步废弃并下线此服务。
# 
# **思考**
# * 提高处理效率

# # 静态地图
# 
# 静态地图服务通过返回一张地图图片响应HTTP请求，使用户能够将高德地图以图片形式嵌入自己的网页中。用户可以指定请求的地图位置、图片大小、以及在地图上添加覆盖物，如标签、标注、折线、多边形。
# 
# URL:https://restapi.amap.com/v3/staticmap?parameters
# 
# 请求参数：key(必填)location(部分必填)
# 选填参数：zoom  size
# 
# **思考**
# 
# * 获取用户所需地图

# In[23]:


def staticmap(key,location,zoom:str,size=None,scale=None,markers=None,labels=None,paths=None,traffic=None,sig=None):
    """获取高德API地理编码
    注释： key是指高德API密钥，请去注册
   location:地图中心点 经度和纬度
   zoom:地图级别
    
    """

    url = "https://restapi.amap.com/v3/staticmap?parameters"
    params = {
        "key":key,
        "location":location,
        "zoom":zoom,
        "size":size,
        "scale":scale,
        "markers":markers,
        "labels":labels,
        "paths":paths,
        "traffic":traffic,
        "sig":sig
    }
    
    response  = requests.get(url,params=params)
    data = response.url
    return data


# In[24]:


map = staticmap(my_key,'113.679287,23.632575',zoom=15)
map


# # 坐标转换
# 坐标转换是一类简单的HTTP接口，能够将用户输入的非高德坐标（GPS坐标、mapbar坐标、baidu坐标）转换成高德坐标。
# 
# URL：https://restapi.amap.com/v3/assistant/coordinate/convert?parameters
# 
# 请求方式：GET
# 
# * 请求参数：key(必填)location(必填)
# * 选填参数：coordsys sig output
# 
# ***思考***
# 
# 批量数据转化

# In[25]:


def assistant(key,locations,coordsyss=None):
    """获取高德API地理编码
    注释： key是指高德API密钥，请去注册
   location:地图中心点 经度和纬度
   coordsys:原坐标系
    """
    url = "https://restapi.amap.com/v3/assistant/coordinate/convert?parameters"
    parameters = {
        "key":key,
        "locations":locations,
        "coordsyss":coordsyss,
        "output":json
    }
    
    response  = requests.get(url,params=parameters)
    return response.json()


# In[26]:


assistant(my_key,"116.481499,39.990475|116.481499,39.990375",'gps')


# # 天气查询 
# 天气查询是一个简单的HTTP接口，根据用户输入的adcode，查询目标区域当前/未来的天气情况。
# 
# URL
# 
# https://restapi.amap.com/v3/weather/weatherInfo?parameters
# 
# * 请求参数：key(必填)city(必填)
# * 选填参数：extensions
# 
# ***思考***
# * 汽车导航天气预报

# In[27]:


def weather(key,city,extensions=None,output=None):
    """获取高德API地理编码
    注释： key是指高德API密钥，请去注册
         extensions气象类型
        可选值：base/all
         base:返回实况天气
          all:返回预报天气
    """
    url = "https://restapi.amap.com/v3/weather/weatherInfo?parameters"
    parameters = {
        "key":key,
        "city":city,
        "extensions":extensions,
        "output":json
    }
    
    response  = requests.get(url,params=parameters)
    return response.json()


# In[28]:


weather(my_key,'110101')


# # 输入提示
# 输入提示是一类简单的HTTP接口，提供根据用户输入的关键词查询返回建议列表。
# 
# URL
# 
# https://restapi.amap.com/v3/assistant/inputtips?parameters
# 
# * 请求参数：key(必填)keywords(必填)
# 
# ***思考***
# * 广告推送
# * 用户推荐系统

# In[29]:


def ts(key,keywords,type=None,location=None,city=None,citylimit=None,datatype=None,sig=None,output=None,callback=None):
    """获取高德API地理编码
    注释： key是指高德API密钥，请去注册
         type:POI分类
         location:坐标
         
    """
    url = "https://restapi.amap.com/v3/assistant/inputtips?parameters"
    parameters = {
        "key":key,
        "keywords":keywords,
        "type":type,
        "location":location,
        "city":city,
        "citylimit":citylimit,
        "datatype":datatype,
        "sig":sig,
        "callback":callback,
        "output":json
    }
    
    response  = requests.get(url,params=parameters)
    a = response.json()
    return pd.json_normalize(a['tips'])


# In[30]:


ts(my_key,'肯德基','050301','116.481488,39.990464','北京')


# # 交通态势

# 交通态势是一类简单的HTTP接口，提供根据用户输入的内容能够返回希望查询的交通态势情况。
# 
# URL
# 
# https://restapi.amap.com/v3/traffic/status/rectangle?parameters
#     
# * 请求参数：key(必填)rectangle
# 
# * 选填参数：extensions  level
# 
# ***思考***
# * 最好的路线预判

# In[192]:


def traffic(key,rectangle,level=None,extensions=None,sig=None,output=None,callback=None):
    """获取高德API地理编码
    注释： key是指高德API密钥，请去注册
        level:道路等级
         rectangle代表此为矩形区域查询
    """
    url = "https://restapi.amap.com/v3/traffic/status/rectangle?parameters"
    parameters = {
        "key":key,
        "level":level,
        "extensions":extensions,
        "rectangle":rectangle,
        "sig":sig,
        "callback":callback,
        "output":json
    }
    
    response  = requests.get(url,params=parameters)
    a = response.json()
    return a


# In[193]:


traffic(my_key,'116.351147,39.966309;116.357134,39.968727')


# ## infocode:10012  该功能已经不向新用户开放

# In[ ]:




